package com.wang.service;

import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
import com.wang.bo.PaymentBO;
import com.wang.controller.util.OrderUtil;
import com.wang.entity.Cart;
import com.wang.entity.PayInfo;
import com.wang.entity.Product;
import com.wang.mapper.CartMapper;
import com.wang.mapper.PayInfoMapper;
import com.wang.mapper.ProductMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * @Classname PayService
 * @Description TODO
 * @Date 2024/9/14 10:42
 * @Created by pc
 */
@Service
public class PayService {
    // 支付成功的页面
    @Value("${alipay.returnUrl}")
    private String returnUrl;
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    @Resource
    private CartMapper cartMapper;
    @Resource
    private ProductMapper productMapper;
    @Resource
    private PayInfoMapper payInfoMapper;
    /**
     *  下单支付
     * */
    public Object pay (PaymentBO bo) throws Exception {
        String orderNo = OrderUtil.getOrderNo();
        System.out.println(orderNo);
        // 生成 订单号 需要存入 redis  订单号最为key 用户id作为value  20240914111420067 - 21
        stringRedisTemplate.opsForValue().set(orderNo,bo.getUserId().toString());
        //调用sdk，发起支付
        AlipayTradePagePayResponse response = Factory.Payment
                //选择网页支付平台
                .Page()
                //调用支付方法，设置订单名称、我们自己系统中的订单号、金额、回调页面
                .pay(bo.getSubject() , orderNo, bo.getTotal().toString() , returnUrl);
        //这里的response.body，就是一个可以直接加载的html片段，
        // 这里为了简单我直接返回这个片段，前端直接
        return response.body;
    }


    // 修改订单状态
    @Transactional(propagation = Propagation.REQUIRED)
    public void updatePayStatus(Map<String, String[]> map) {
        String orderNo = map.get("out_trade_no")[0];
        // 1.修改库存
        // 获取到这个用户购买了一些什么东西
        // 获取用户编号
        Integer userId = Integer.parseInt(stringRedisTemplate.opsForValue().get(orderNo));
        // 获取已经购买的购物车信息
        List<Cart> cartBuyList = cartMapper.findCartByUserIdAndBuyed(userId);
        cartBuyList.forEach(cart->{
            Integer productId = cart.getProductId();
            Integer quantity = cart.getQuantity();
            // 根据id 获取商品表的商品信息 减少库存
            Product product = productMapper.findById(productId);
            // 减少库存
            product.setStock(product.getStock()-quantity);
            // 更新数据库
            productMapper.updateStock(product);
        });
        // 2.删除用户购物车中的信息
        cartMapper.delBuyedCartById(userId);
        // 3.添加支付订单信息
        PayInfo payInfo = new PayInfo();
        payInfo.setCreateTime(new Date());
        payInfo.setUpdateTime(new Date());
        payInfo.setUserId(userId);
        payInfo.setOrderNo(Long.parseLong(orderNo));
        payInfo.setPayPlatform(1);
        payInfo.setPlatformNumber(map.get("trade_no")[0]);
        payInfo.setPlatformStatus(map.get("trade_status")[0]);
        payInfoMapper.add(payInfo);
        // 4.删除redis
        stringRedisTemplate.delete(orderNo);
    }
}
